<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            background-color: #bbb;
        }

        #canvas {
            background-color: #000;
        }
    </style>
</head>

<body>
    <canvas id="canvas" width="400" height="400"></canvas>
    <textarea name="" id="log" cols="30" rows="10"></textarea>
</body>
<script src="./utils.js"></script>
<script src="./arrow.js"></script>
<script src="./ball.js"></script>
<script src="./ship.js"></script>
<script>
    window.onload = () => {
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        var log = document.getElementById("log"),
            ball = new Ball(),
            mouse = utils.captureMouse(canvas),
            vx = Math.random() * 10 - 5,
            vy = -10,
            bounce = -0.7,
            gravity = 0.2,
            isMouseDown = false,
            oldX, oldY;

        ball.x = canvas.width / 2;
        ball.y = canvas.height / 2;

        canvas.addEventListener("mousedown", function () {
            if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {
                isMouseDown = true;
                oldX = ball.x;
                oldY = ball.y;
                canvas.addEventListener("mouseup", onMouseUp, false);
                canvas.addEventListener("mousemove", onMouseMove, false);
            } else {
                log.value = "canvas: mousedown"
            }
        }, false);

        function onMouseUp() {
            isMouseDown = false;
            canvas.removeEventListener("mouseup", onMouseUp, false)
            canvas.removeEventListener("mousemove", onMouseMove, false)
        }

        function onMouseMove(e) {
            ball.x = mouse.x;
            ball.y = mouse.y;
        }

        function trackVelocity() {
            vx = ball.x - oldX
            vy = ball.y - oldY
            oldX = ball.x
            oldY = ball.y
        }

        function checkBoundaries() {
            let left = 0,
                right = canvas.width,
                top = 0,
                bottom = canvas.height;
            vy += gravity;
            ball.x += vx;
            ball.y += vy;

            if (ball.x + ball.radius > right) {
                ball.x = right - ball.radius
                vx *= bounce
            } else if (ball.x - ball.radius < left) {
                ball.x = left + ball.radius
                vx *= bounce
            }
            if (ball.y + ball.radius > bottom) {
                ball.y = bottom - ball.radius
                vy *= bounce
            } else if (ball.y - ball.radius < top) {
                ball.y = top + ball.radius
                vy *= bounce
            }
        }

        (function drawFrame() {
            window.requestAnimationFrame(drawFrame, canvas)
            context.clearRect(0, 0, canvas.width, canvas.height)
            if (isMouseDown) {
                trackVelocity();
            } else {
                checkBoundaries();
            }
            ball.draw(context)
        }())
    };
</script>

</html>